package com.dianzhihan.http3;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class MyController {
    static class Person {
        public String name;
        public int age;
        public boolean teacher;

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", teacher=" + teacher +
                    '}';
        }
    }

    // 注意：@ResponseBody + String 返回值类型就不是 application/json，而是 text/html 格式
    // 1. 必须是 @PostMapping（或者 @RequestMapping）—— 必须支持 POST 方法，才有请求体
    // 2. 形参被 @RequestBody 修饰，表示从请求体中读取内容
    // 3. 形参的类型是 对象、Map、List
    // 4. 发起请求时，必须格式一致
    @PostMapping("/read-person")
    @ResponseBody
    public String readPerson(@RequestBody Person person) {
        System.out.println(person);
        return "OK";
    }

    // 动态资源中输出 JSON
    // 0. 得被 @RequestMapping 修饰，是个动态资源
    // 1. 方法应该被 @ResponseBody 注解修饰，表示，返回的内容填充到响应体中
    // 2. 方法的返回值类型必须是：某个类、Map、List 等集合类型
    @GetMapping("/json-of-person")
    @ResponseBody
    public Person jsonOfPerson() {
        Person person = new Person();
        person.name = "西安";
        person.age = 4000;
        person.teacher = false;

        return person;  // SSM 内部会把这个对象序列化成 JSON 格式，并且放置在响应体中
    }

    @GetMapping("/json-of-person2")
    @ResponseBody
    public Map<String, Object> jsonOfPerson2() {
        Map<String, Object> person = new HashMap<>();

        person.put("名字", "张三");
        person.put("职业", "职业狂徒");
        person.put("兴趣", "学习");
        person.put("年龄", 98);
        person.put("是否被捕", false);

        return person;  // SSM 内部会把这个对象序列化成 JSON 格式，并且放置在响应体中
    }

    @GetMapping("/json.list")
    @ResponseBody
    public List<Person> list() {
        List<Person> list = new ArrayList<>();

        list.add(new Person());
        list.get(0).name = "张三";
        list.get(0).age = 1;
        list.get(0).teacher = true;

        list.add(new Person());
        list.get(1).name = "李四";
        list.get(1).age = 10;
        list.get(1).teacher = true;

        list.add(new Person());
        list.get(2).name = "王五";
        list.get(2).age = 100;
        list.get(2).teacher = false;

        return list;
    }
}
